其他
为什么数据库连接池要用 ThreadLocal 呢?不用会怎么样?
>>号外:关注“Java精选”公众号,回复“2021面试题”,领取免费资料!“Java精选面试题”小程序,3000+ 道面试题在线刷,最新、最全 Java 面试题!
回归正题,还是拿上面的图来说事!
java.sql.Driver.connect(url, props);
不同的线程在同一个时间( 或者 同一个线程在多个地方)从连接池中拿到的Connection,肯定不是同一个连接。(反过来讲:不同时间的两个线程,一前一后,则有可能拿到同一个连接)
总结:
首先,我们为了避免单一数据库连接的创建和关闭耗费时间和性能,引入了数据库连接池,提前创建好了n条连接放入池中,如果是单线程情况下,那这样挺好的 那如果是多线程情况下呢?还是上面那段话,假设同一时间多个线程从数据库连接池获取连接,那肯定拿的是不同的连接,我当前线程和别的线程拿的连接不一样,那我当前在crud的时候,不在一个事务之内。 假设不同时间的多个线程要从数据库连接池拿连接,那这个时候就可能拿到的是同一个连接了,那我多个线程线程拿到的是同一个连接,也就是说在多个线程在同一个事务之内,线程a执行了插入还没来得及提交,线程b此时来了个更新,在线程a还未操作完之前,线程b更新完了后,直接把连接给close了,线程a插了一半发现插不了了。。。此时肯定在想,这™是谁在搞我。 为了确保不同时间多个线程可能拿到的是同一个连接,那么此时threadlocal闪亮登场,就算我拿的是“同一个连接”,在引入了threadlocal后,每个线程之间都会创建独立的连接副本,将collection各自copy一份,这样就互相不干扰了。
作者:奔跑的乌龟
blog.csdn.net/qq_42405666/article/details/108258820
Java 程序员不可或缺的 11 种 IntelliJ IDEA 插件,提升开发效率!
坑你没商量!盘点 JDK 中最常见的“翻车”现场,你都踩过那些坑?
Java 中 Service 层和 DAO 层有必要每个类都加上接口吗?
美团实习面试:熟悉红黑树是吧?能不能写一下?说一说空间和时间复杂度?
Spring Boot 集成 WebSocket,实现前后端即时通讯,如此简单!
Spring Boot 接口频繁超时,Alibaba 开源 Arthas 精准定位 BUG 问题!
踩坑!Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?
Spring Boot 中如何实现 Mybatis 逆向工程,你 GET 到了吗?(附源码)